import {
  toStringTypeCheck,
  ObjectOnlyPushSet,
  emptyClone,
} from '../../../../components/aaanewApp/global/global';

let propsSettleInf = {
  data: [
    'props',
    'propsVal',
    'mindProps',
    'rebackProps',
    'useProps',
    'exposeProps',
  ],
  props: [],
  propsVal: {},
  mindProps: mindProps,
  rebackProps: rebackProps,
  useProps: useProps,
  exposeProps: exposeProps,
};

const taskInfo = 'taskInfo';

const currentPropsObj = 'currentPropsObj';

const mindData = 'mindData';

/**
 * 实例 的 props 目标
 */
const infactProps = 'props';

/**
 * 实例 的 propsVal 目标
 */
const infactPropsVal = 'propsVal';
/**
 * 记录当前 的所有 props 信息记录
 * @param {String} str 将 str 设置为该集合的名称
 */
function mindProps(str) {
  console.log(str);
  if (
    !ObjectOnlyPushSet(
      this[taskInfo],
      str,
      emptyClone(this[taskInfo][currentPropsObj]),
      mindData
    )
  ) {
    console.log('sorry we have recorded :' + str + ' props infos');
  }
  return this[taskInfo][str];
}

/**
 * 重置 props 为初始化 如果中间添加 了某个属性 则 直接记录
 */
function rebackProps() {
  this[taskInfo][currentPropsObj] = emptyClone(this['propsVal']);
}

/**
 * 使用 用户 记录的 某一个 函数片段
 * @param {String} str 用户实例 上 记录过的 mindProp [key]
 * @returns {Boolean} 返回 是否 使用成功
 */
function useProps(str) {
  if (this[taskInfo][mindData].indexOf(str) == -1) {
    console.log('sorry we not recorded your mind Prop overname :' + str);
    return false;
  }
  this[taskInfo][currentPropsObj] = emptyClone(this[taskInfo][str]);
  return true;
}

/**
 * 暴露 属性信息
 * @param {String|Object} key 单个 属性名称 或者 暴露参数集合
 * @param {String|undefined} val value | undefined
 * @param {Number|undefined} deepth 只搜索深度 一次
 * @returns
 */
function exposeProps(key, val, deepth) {
  if (deepth == 1) {
    return;
  }
  if (toStringTypeCheck(key, 'string')) {
    ObjectOnlyPushSet(this[infactProps], key);
    this[infactPropsVal][key] = val;
  } else if (toStringTypeCheck(key, 'object')) {
    for (const inkey in key) {
      if (Object.hasOwnProperty.call(key, inkey)) {
        deepth == undefined ? (deepth = 0) : deepth++;
        exposeProps(inkey, key[inkey], deepth);
      }
    }
  }
}

let b = { name: 'prop', settleInfo: propsSettleInf };

export { b as prop, exposeProps };
